約 4,655,770 件
https://w.atwiki.jp/easybotter_wiki/pages/25.html
※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。 ランダムPOSTを●分おき、リプライを▲分おきにしたい! [#ra5d511d]リプライ [#c8e65725] ランダムPOST [#nd87a60d] 時間別にリプライorPOSTを分けたい! [#b7bf333f] 落とし穴に注意 [#rf62e452] 落とし穴に注意2…CRONと設置サーバーの時間がズレているズレを知る ズレに対処する 指定した時間に実行の処理が終わらない 脱初心者してから考える事動作テストにも使える代入演算子 落とし穴に注意3…演算子「%」の理解演算子「%」とは? 演算子「%」の有効活用 コメント [#n0b1997d] ランダムPOSTを●分おき、リプライを▲分おきにしたい! [#ra5d511d] ここではランダムPOSTを30分おき、リプライを2分おきで考えます(※cronは2分間隔設定にする。) リプライ [#c8e65725] リプライ間隔はcronの間隔と同じなので、何か条件付けるということはしなくてOKです。 bot.phpに $response = $eb- reply(2,"data.txt","reply_pattern.php"); を追加してあげましょう。 ランダムPOST [#nd87a60d] bot.php内でも解説されている通り //bot.phpを実行したときに、0分、15分、30分、45分だったら実行される if(date("i") % 15 == 0){ $response = $eb- postRandom("data.txt"); } を使っていきます。 date("i")と言うのは、現在の時刻・○時△分の△部分を表します。 ほかにもdate("G")やdate("Y")等色々な現在時刻を表すものがあります。 詳しくは各自ここで調べて下さい。(外部リンク:http //www.php.net/manual/ja/function.date.php) % 15 == 0と言うのは、事前のdate("i")が15で割り切れることを意味します。 ここはifなので、bot.phpへアクセスした時、15で割り切れる時間(分)のみ{}の中身を実行します。 bot.phpへアクセスした時の時間が0分(60分)と15分、30分、45分だった時、いずれも15で割り切ることが出来ますね。 では今回は30分おきに設定したかったので if(date("i") % 30 == 0){ $response = $eb- postRandom("data.txt"); } と書いてみます。こうすると0(60)分と30分の時のみ実行されます。1時間に2回実行させることになります。 目的達成です! ここで注意したいのは、リプライの記述をif{}内に入れないことです。 リプライの記述まで{}へ入れてしまっては、リプライまで30分おきになってしまいます。 時間別にリプライorPOSTを分けたい! [#b7bf333f] 上の「ランダムPOSTを●分おき、リプライを▲分おきにしたい!」でdate("i")が現在の時刻○時△分の△部分だというのは分かりました。 今回は朝(6~10時)morning.txtと昼(11~15時)noon.txt、夜(16~0時)evening.txt、深夜(1~5時)night.txtそれぞれ別のPOSTをさせてみましょう。 ただし今回は△分ではなく○時なので、date("i")は使えません。○時はdate("G")を使用します。 24時間表記ですが、24という数値はありません。24時は0時扱いになります。 まずは朝の部分。現在の時刻・○時の○部分が6~10の時。 if(date("G") 5 date("G") 11){ $response = $eb- postRandom("morning.txt"); } これは「もし、現在時刻が5時より大きく、11よりも小さい時」と言うifの条件式になります。 「 」は「and」でも構いません。英字の通り「かつ」と言う意味があります。 注意したいのは不等号!これは算数レベルで考えてください。 例 全角 説明 A 5 A>5 Aは5より大きい。つまり6~23。 A 5 A<5 Aは5より小さい。つまり0~4。 A =5 A≧5 Aは5以上。つまり5~23。 A =5 A≦5 Aは5以下。つまり0~5。 次に昼の部分。現在の時刻・○時の○部分が11~15の時。 if(date("G") 10 date("G") 16){ $response = $eb- postRandom("noon.txt"); } でも良いのですが… if(date("G") 5 date("G") 11){ $response = $eb- postRandom("morning.txt"); }else if(date("G") 10 date("G") 16){ $response = $eb- postRandom("noon.txt"); } とelseを付けて朝の部分とくっ付けてあげるとすっきりします。 elseは、先のif条件(朝)に合わなかった場合else以降を実行しようとします。 次に夜の部分。現在の時刻・○時の○部分が16~24の時。 if(date("G") 15 date("G") 1){ $response = $eb- postRandom("evening.txt"); } ここまで来ると、やってしまいがちですが…これは大きな間違い!!! これでは「15より大きくて、1より小さい」というありえない条件になってしまいます。 if(date("G") 15 || date("G") 1){ $response = $eb- postRandom("evening.txt"); } としてやることで「現在時刻が15より大きい、または1より小さい場合」となります。 「||」は「or」でも構いません。英字の通り「または」と言う意味があります。 if(date("G") 5 date("G") 11){ $response = $eb- postRandom("morning.txt"); } else if(date("G") 10 date("G") 16){ $response = $eb- postRandom("noon.txt"); } else if(date("G") 15 || date("G") 1){ $response = $eb- postRandom("evening.txt"); } 繋げるとこんな感じです。 次に深夜の部分。現在の時刻・○時の○部分が1~5の時。 if(date("G") 0 date("G") 6){ $response = $eb- postRandom("night.txt"); } としてあげてもいいのですが…今まで6~10,11~15,16~24時までは指定してきました。 残りの時間はこの1~5時しかないので、わざわざ条件を書いてやることはないのです。 if(date("G") 5 date("G") 11){ $response = $eb- postRandom("morning.txt"); } else if(date("G") 10 date("G") 16){ $response = $eb- postRandom("noon.txt"); } else if(date("G") 15 || date("G") 1){ $response = $eb- postRandom("evening.txt"); } else { $response = $eb- postRandom("night.txt"); } で完成です! リプライも同様に条件付けてあげることで、時間別パターン可能です。 落とし穴に注意 [#rf62e452] if(date("i") % 30 === 0){ はdate("i")が30で割り切れる分数、というのを解説しました。 これを30分おき等、分数ではなく1時間毎にしたい。 if(date("G") % 1 === 0){ と書く人をよく質問スレで見かけます。 これは大きな間違いです。 詳しく書くと……… if(date("i") % 30 === 0){ は0,30分に動くことになりますね。 ここでもしcronが2分毎ではなく10秒毎にアクセスするとしたら。 毎時0分(30分)の0秒、10秒、20秒、30秒、40秒、50秒すべての秒数で作動してしまうのです。 これは、cronが分数おきだからこそ使える書き方なのです。 if(date("G") % 1 === 0){ と書いてしまうと、cronが2分毎だった場合、毎時の0,2,4,6,,,,,,,,,,,,58分と2分毎に作動してしまいます。 0分きっちりに作動させたいなら、難しく考えず if(date("i") == "0"){ としてしまえばオッケーです。 落とし穴に注意2…CRONと設置サーバーの時間がズレている 掲示板でも多い質問の一つに「リプライは動いてるけど時間分け指定をしたら通常ポストしなくなった」というものがあります。 特に見られる理由は下記3点です。 1:if・switchなどの内容が間違っている ……慣れた人でも凡ミスをすることがあるので一つずつ再確認しましょう 2:CRONがbot.phpにアクセスする時間外を指定している ……「CRONは2分毎なのにbot.phpでは3分毎の設定」などちぐはぐでは?指定時間を揃えましょう 3:CRONと設置サーバーの時間がズレている ……どのくらいのズレがあるのか確認して適切に処置しましょう ここでは3番の対処を説明します。 ズレを知る CRONと設置サーバーの時間のズレを確認するための下準備をします。 (data.txtやbot.phpの内容を既に変更している場合は適宜ファイル名を変更して対応してください) data.txtの内容(この1行のみ) {hour}時{minute}分{second}秒 bot.phpの実行内容(下記以外のリプライ・TL反応・ポスト・フォロー返し等はコメントアウトする) $response = $eb- postRandom("data.txt"); CRONの設定 5分毎、10分毎など、CRON提供側で許容されている範囲内で設定します。 1分毎・2分毎での設定はズレを計るのに向きません、できれば0分・5分・10分…という0分始まりの5分毎をオススメします。 ここまでが下準備です。 実際にCRONを起動させ、「●時●分●秒」というポストが数回行われるまで待ちます。 文字化けするようであれば文字コード・改行コードを確認、ポストが行われないようであれば指定したbot.phpが正しいURLか確認します。 0分始まりの5分毎の場合、「分」は0もしくは5の倍数でなければなりませんが、これ以外の場合にはズレが生じていることになります。 また、「分」が0もしくは5の倍数であっても「秒」が59秒……など数秒のラグで「分」が変わってしまうような値では不安が残ります。 何分のズレなのか、ズレが生じるのはどの程度の頻度か、等をチェックしたら次の段階です。 ズレに対処する 一番簡単なのはCRONの実行時間をずらして、サーバーの実行時間に合わせてやることです。 しかしこの方法では更にズレが生じたり、時間ズレと関係なくサーバーが不安定で実行に時間がかかった場合などに対処しきれません。 そこでbot.phpの時間指定を厳密なものではなく余裕をもった書き方に変えます。 毎時0分にランダムポストしたい場合は下記のように書きますが、 if(date("i") == 0){ $response = $eb- postRandom("data.txt"); } ズレが生じている場合は下記のように余裕をもった時間指定に書き換えます。 //以下は毎時0分~1分の間に実行(2分未満の範囲で遅い場合) if(date("i") = 1){ $response = $eb- postRandom("data.txt"); } //以下は毎時59分か0分に実行(2分未満の範囲で早い場合) if(date("i") == 0 || date("i") == 59){ $response = $eb- postRandom("data.txt"); } このように余裕をもたせることで多くの場合は解決します。 しかし、bot.phpの実行内容を増やしていくと、時には「CRONと設置サーバーにズレがないのに実行されてない?」という事があります。 これについても過去に同様の事例が多くありましたが、多くは下記3つに当てはまります。 1:処理落ち・タイムアウト……設置サーバーの能力を越えているかtwitterが重い場合など 2:ifやswitchの書き方の問題……閉じ忘れや勘違いがないか再確認 3:実行中に指定した時間を過ぎてしまった……bot.phpの書き方や改造で対応 次の項目では3番に当てはまる事例への対処を説明します。 指定した時間に実行の処理が終わらない EasyBotterに慣れてくると、単純な機能だけでなく様々な機能を時間別で組み合わせて実行することも多くなります。 一回に処理する機能が増えれば処理時間は長くなります。 また初期は気にならない処理時間でも、フォロー・フォロワーの増加などで処理時間が長くなることもあります。 まずはbot.phpで指定できる機能がどのような動きをしているかを考えてみましょう。 設置サーバー内の処理だけで済む ・ランダムポスト ・ローテーションポスト ……設置サーバー内のファイルからデータから選んでtwitterに送る twitterから情報を呼び出さなければならないもの ・リプライ ・タイムライン反応 ・自動フォロー返し ……初めにtwitterから情報を呼び出し、その内容を設置サーバー内のファイルと照らし合わせて処理を行い、その結果をtwitterに送る。 twitterが重い場合は呼び出し時点で処理時間を食う。 またリプライ数・タイムラインの速度やフォロワー数などで処理時間が大きく変わる。 上記を踏まえて下記のようなbot.phpを見てみましょう。 //毎回リプライ返し $response = $eb- reply(2,"data.txt","reply_pattern.php"); //毎時0分にランダムポスト if(date("i") == 0){ $response = $eb- postRandom("data.txt"); } この書き方に全く問題はありません、CRONと設置サーバーの時間ズレがなければうまく動くことでしょう。 しかし、時間ズレはないのに定期ポストが不安定になることも予想される書き方でもあります。 その理由は「プログラムの常識」にあります。 プログラムは上から順に実行されていきます。 つまり毎時0分には、「リプライ返しを全て終えてからランダムポストをする」という順番になります。 「リプライ返し」は先に説明した通り「ランダムポスト」よりtwitterと情報をやり取りする回数が多く、twitterの重さや送られてくるリプライの量によって処理にかかる時間が左右されやすいものです。 つまりCRONが0分ちょうどにbot.phpを叩いたとしても、「リプライ返し」の処理に時間がかかり過ぎてしまい「ランダムポスト」の処理にとりかかった時点で0分を過ぎている、という事態が予想できるのです。 つまり //毎時0分にランダムポスト if(date("i") == 0){ $response = $eb- postRandom("data.txt"); } //毎回リプライ返し $response = $eb- reply(2,"data.txt","reply_pattern.php"); このような書き方にすると、ランダムポストから処理が始まるので、CRONが定刻通りであれば順当に処理が行われるのです。 ただし、レンタルサーバーによっては「●秒以上実行し続けているプログラムは処理途中であっても終了させる」という機能や規約が設定されている場合もあります。 また、処理量がサーバーの処理能力を越えてしまうとダウンする可能性もあります。 このような場合にはプログラム自体を軽くしたり、処理を分散させる努力、またはサーバーを変更する必要が求められます。 脱初心者してから考える事 ifやswitchでの時間わけ設定が増えてくるとどうしても処理時間が長くなりがちです。 脱初心者したら処理の効率化ができるよう、bot.phpの書き方を工夫してみましょう。 脱初心者したばかりの方にとって最も簡単で有効な処理の効率化は「date関数の呼び出し回数を減らす」ことです。 date関数は時間を呼び出すdate("G")やdate("i")だけでなく、月を呼び出すdate("n")、日にちを呼び出すdate("j")など様々なものがあります。 年月日・曜日・時間などを多用することで様々な指定ができる代わりに、逐一date関数の内容をサーバーに問い合わせ呼び出す動作が増えてしまうので処理速度が低下します。 また、bot.phpの記述内容が増えるに従って一番下の方に書かれたものが時間外になってしまう可能性も高くなります。 そこで、処理を指定する前に時間をEasyBotterに記憶させて処理速度を上げてみましょう。 //date("i")を$minuteに代入する $minute = date("i"); //毎回リプライ返し $response = $eb- reply(2,"data.txt","reply_pattern.php"); //毎時0分にランダムポスト if($minute == 0){ $response = $eb- postRandom("data.txt"); } 代入演算子「=」は、 「A = B」の時「BをAに代入する」 という意味を持ちます。 比較演算子である「==」「===」とはまったく異なるので注意が必要です。 この場合date("i")、つまり分を$minuteという関数に代入しています。 同様の方法でdate関数は全て代入することができます、$minute・$hour・$monthなどのように重複しない範囲で関数の名前をつけることができます。 date関数を他の処理より先に関数へ代入することで、CRONがbot.phpを叩いた時刻や日付等をその処理が終わるまでの間記憶してくれます。 つまり、先に時間がかかる処理をした後や大量のifやswitchを経た最下部の処理でも、「CRONがbot.phpを叩いた時点」の時刻として処理を進めることが可能となるのです。 動作テストにも使える代入演算子 上記で説明した代入演算子を利用することで、「12月31日限定で動くか」というようなテストもできます。 $month = date("n"); $day = date("j"); 本来は上記のようにdate関数を代入しますが、 $month = 12; $day = 31; このように、ダイレクトな値を代入することで仮想の12月31日の状況にすることができますし、違う値を入れれば「12月31日以外では動かないか」のテストもできます。 いずれの場合も初心者のうちに手を出すべきものではありません、ある程度EasyBotterの挙動そしてPHPに慣れた上ですべきことですが、これらを理解しこなせるようになれば中級者の仲間入りの第一歩です。 落とし穴に注意3…演算子「%」の理解 さて、これまでの内容を理解したら構文の中身をもう少し分解してみましょう。 if(date("i") % 15 == 0){ $response = $eb- postRandom("data.txt"); } これまで上記について「15分ごとにランダムポストを実行」と書いていましたが、実際は若干異なり、正確には「0分・15分・30分・45分にランダムポストを実行」となります。 なぜでしょうか、……それは演算子「%」を正しく理解することによって解明できます。 if(date("i") % 15 == 5){ $response = $eb- postRandom("data.txt"); } このように書いても「15分ごとにランダムポストを実行」しますが、「0分・15分・30分・45分にランダムポストを実行」はされません。 なぜでしょうか、……これこそが演算子「%」を使いこなすポイントです。 演算子「%」とは? 演算子「%」はただの割り算ではなく剰余なのです。 剰余と聞くと耳慣れないかもしれませんが、算数的な言い換えをすると「割り算をした時の余り」を求める場合に使う演算子です。 つまり if(date("i") % 15 == 5){ 上記は「分を15で割って余りが5の時」という意味で、「5分・20分・35分・50分の時」という指定となります。 演算子「%」の有効活用 演算子「%」を正しく理解することで活用方法が増えます。 奇数・偶数の振り分けは一々指定しなくても、「% 2」の値が0か1か、という考え方で簡単になります。 //偶数時は、0分始まりで15分ごとに、guusuu.txtからランダムポスト if(date("G") % 2 == 0 date("i") % 15 == 0){ $response = $eb- postRandom("guusuu.txt"); } //奇数時は、5分始まりで10分ごとに、kisuu.txtからランダムポスト else if(date("G") % 2 == 1 date("i") %10 == 5){ $response = $eb- postRandom("kisuu.txt"); } CRONと設置サーバーで時間にズレがある場合でも if(date("i") % 15 == 5 || date("i") % 15 == 6){ このようにすることで「5分・6分・20分・21分・35分・36分・50分・51分」と余裕をもたせた指定にすることができます。 コメント [#n0b1997d] 時間別にリプライorPOSTと同じような感じで、時間別にPOSTしないようにしたいです。何方かよろしくお願いします。 -- 沢谷 (2010-07-26 02 19 00) 沢谷さん>その場合、時間別POSTの応用で$response = $eb- postRandom("");とすればPOSTしません -- 通りすがりのねこ (2010-08-01 21 09 11) もし、if(date("i") == "0"){を使う場合、cronの実行間隔は1分にしなければなりませんか? -- 名無しさん (2010-09-07 16 56 00) もし、if(date("i") == "0"){を使う場合、cronの実行間隔は1分にしなければなりませんか? 回答:その必要はありません -- 通りすがりのねこ (2010-09-09 21 15 34) 時間別POSTを15分おきにしたい場合、例えば時間別は6~10時のみの設定のを15分おき実行だと、if(date("G") 5 date("G") 11 date("i") % 30 === 0) で良いのでしょうか? -- たに (2010-09-19 01 21 04) 夜だけ違うリプライ。bot.php(2) http //livbot.sblo.jp/ の記事が参考になりました。サンプルコード書いてあります。 -- 2時間おきに作動させたい場合 (2010-12-10 05 27 08) 何回かの間隔で、実行したい場合は、カウンターファイルを作る手もあるぞ。パーミッションは666のこと。bot.phpの例で10回間隔で順次投稿したい場合。1間隔1分だと10分間隔です。 function seqnum(){ $iseq = 0; $fname = "count.dat"; $iseq = file_get_contents($fname); if ($iseq = 60) { $iseq = 0; } $iseq = $iseq + 1; file_put_contents($fname,(string)$iseq); //SEQカウンター書き込み echo "参照シーケンス番号 = ".$iseq." br / "; return $iseq; }$iseq = seqnum(); if (($iseq % 10) == 0) { $response = $eb- postRotation("data.txt"); } - koziki_bot (2011-01-28 10 08 59) リプを2分置き、呟きを15分置きにしたかったので「if(date("i") % 15 == 0){ $response = $eb- postRandom("data.txt"); }」と「$response = $eb- reply(2,"data.txt","reply_pattern.php");」を書き込んだのですが上手く動きません。ちなみに「$response = $eb- reply(2,"data.txt","reply_pattern.php");」だけですと正常に動くようです。初心者ながら色々調べてみましたが解決できませんのでもしよければ教えてください。 -- 千紘 (2011-02-20 20 44 36) 千紘さん> cron部分の詳細がないのでわからないですがcronが2分おきなら15分にはcronは起動しないのは分かる? -- 名無しさん (2011-02-20 21 38 41) ランダムPOSTを●分おき~と時間や曜日別にツイートを分ける方法を個別には理解できたのですが、組み合わせ方がわかりません・・・。●曜日の●時から●時まで、●分ごとにツイート(リプライ)という風にしたいのですが・・・何方かよろしくお願いします。 -- 番 (2011-02-21 00 39 31) そーでした、PHPのファイルを時間ごとに自動的に叩くアプリを使っているのでcronは使ってないです。このアプリは自分で作ったのですがどうしようかなあ??興味ある方、ツイッターで質問してみてください。scネームはハンドル名と同じです。 -- koziki_bot (2011-02-21 00 49 39) 回答ありがとうございます。理解しました!2分に合わせたいなら10分置き、15分に合わせたいなら3分置きにするなどどちらでも割れるような値にしなくてはならないということですね。 -- 千紘 (2011-02-21 07 58 19) すみません。曜日と時間で分けて30分ごとにツイートさせたいのですが、 -- 番 (2011-03-08 22 45 13) 途中で切れてしまいましたすみません・・・。曜日と時間で分けて30分ごとにツイートさせるには if(date("i") % 30 === 0){ で30分ごとにツイートするように指定して、switch(true)で case (date("w") == "1″ date("G") "6″ date("w") == "1" date("G") "12") としても出来ないでしょうか? すみませんとても困ってます・・・よろしくお願いします。 -- 番 (2011-03-08 22 52 52) bot.phpはいじってないのですが、2分置きどころかリプライを返してくれません…どうすれば良いのでしょうか? -- 翔 (2011-06-01 22 45 03) bot.phpはそのままで、リプはreply_patternから返すようにしているのに、なぜかdate.txtの言葉から拾って返してしまいます。対処方法を教えて下さい…。 -- 名無しさん (2011-06-02 02 29 36) @pagesかな?Twitterが重いか@pagesの鯖が重かったり障害があるときになるよ。これは@pagesが正常になるのを待つしか無いね -- 名無しさん (2011-07-18 20 26 51) 30分とか割り切れる話をするだけで、40分や90分間隔などの場合を書かないあたり不十分なwikiだなと感じる -- 名無しさん (2011-10-29 13 11 12) ↑40分や90分なら応用でいくらでもやりようがあるし、普通はcronでどうとでもなる。返信が返せないじゃないかならファイルを分ければいいだけのこと -- 名無しさん (2011-11-14 00 53 22) まあ40分は確かにめんどいかもねー。前回のツイート時刻を取得できればちょっと楽かもしれないけど。 -- 名無しさん (2012-04-21 17 59 52) 時間別リプライをしようと思い、「リプライも同様に条件付けてあげることで、時間別パターン可能です」とあるので時間別ランダムポストと同様にこのように時間分けをしたのですがどうも上手く動いてくれません【if( date("G") =1 date("G") = 6 ){$response = $eb- reply(3,"","reply_pattern_night.php");} else{$response = $eb- reply(3,"","reply_pattern.php");}】(ランダムポストは時間分けに成功してます)。ほんとうにこれで動くのでしょうか? -- むー (2012-05-20 05 07 43) ↑bot.phpの記述の順序を入れ替えたら成功しました、お騒がせしてすみません -- むー (2012-05-28 01 05 28) 何時~何時、何曜日~何曜日とpostさせないようにしたいのですが上手く行きません。randompostの上にいかの構文を付け足しました。 "if(date("G") 15 || date("G") 1){ $response = $eb- postRandom("data.txt");" -- PON (2013-06-24 20 01 19) 時間別のリプですが、たとえば6時30分に0630.txtを呟かせたい場合は、 if(date("G I") 6,29 date("G I") 6,31){ $response = $eb- postRandom("0630.txt"); とすればいいのでしょうか? -- MOG (2013-09-22 15 56 03) 名前 コメント
https://w.atwiki.jp/easybotter_wiki/pages/13.html
はじめに 用意するものPHP(5以上)が使えるレンタルサーバー使用実績のあるサーバー botに使うTwitterのアカウント テキストエディタWindows用テキストエディタ Macintosh用テキストエディタ 文字コード(UTF-8)について FTPソフトWindows用 Mac用 はじめに 何も手を加えずそのままうp→最低限の機能を手動で動かす、この間のエラー対処することから始めましょう。 「プログラミングができなくても~」と言っても、公式にも書かれているように、最低限知っておかねばならない言葉や材料があります。 それらを意味を理解しないままスキップして設置解説サイト通りにやっても動かない・分からないといわれても誰も助けてくれません。 あなたがまず理解しないことにはスタートラインに立てないのです。 面倒くさがらず調べて、言われている意味が分かるようになってからプログラムに触れましょう。それからでも遅くはありません。 いきなり設置して、cronでアクセスさせて正常に機能しなかったら、基本的なPHPエラーの原因は分かりません 用意するもの おすすめのものをピックアップしています。 使い方は各自、自己責任で学んでください。 PHP(5以上)が使えるレンタルサーバー 使用実績のあるサーバー 注:実績があるからといっても、最低限サーバー仕様やオンラインマニュアル、よくある質問等にも目を通しておきましょう。 あまりに無知・無茶すぎるとレンタル元から『twitterのbot設置は禁止します』となるかもしれません。 すでにPHP5が使えるサーバーで禁止しているところもあります 有料サーバーJust-Size.Networks XREA plus さくらインターネット (スタンダード以上) LaCoocan(スタンダード以上) ロリポップ 無料サーバーXREA @pages fizby.net TOK2 ちなみに、初心者質問スレなどから見ると@pagesが人気のようです。 land.toはEasyBotterは動作不可。TOK2はSSLが使えないので本体改造が必要。FileQはver.2なら設置可能。 ver1.42でのOAuth認証はland.toと共に出来ない(curlエラー) botに使うTwitterのアカウント Twitter.comからアカウントを登録する。もちろんBOT専用のものを取得する。 ※10個以上の類似したアカウントを取得すると削除される、という情報があります。複数のアカウントを持っている場合は注意して下さい。 テキストエディタ phpに対応していて、コマンドや要素の自動色分けに対応したものを選びたい。 また、Easybotterのファイル群は全て 「文字コード:UTF-8、改行コード LF」 であるので、これを確認・指定できるものだとなお良い。 Windows用テキストエディタ Peggy Pad(Peggy Pad配布元) ※シェアウェアもあるので注意 NoEditor/UnEditor(NoEditor/UnEditor配布元) ※シェアウェアもあるので注意 EmEditor Free(EmEditor Free配布元) ※シェアウェアもあるので注意ツール→すべての設定プロパティで、基本→行番号を表示、記号→全角空白表示にチェックを入れておくと編集に便利 TeraPad(TeraPad配布元)ファイルを保存するときは、文字コード:UTF-8N、改行コード LFで K2Editor(K2Editor配布元) PHPエディタ(PHPエディタ配布元)standalone版おすすめ。PHP(easyPHP等でもok)も同時にDL・インストールしてphp.exeの場所を入力してやると構文チェック機能を使えるようになる。 ソースの先頭数行に全角文字がない場合は、読み込み時に日本語が文字化けしてしまうことがあります。そういう場合は「ファイル」-「再読込」でUTF-8を指定してください。 Macintosh用テキストエディタ CotEditor(CotEditor配布元) mi(mi配布元/mi 用の PHP モード) 文字コード(UTF-8)について 正式にはUTF-8でバイトオーダー(BOM)無しです。ソフトによってはこれを「UTF-8N」や「UTF-8(no signature)」などと表記していますが、わざわざBOM有りにする必要は有りません。 FTPソフト DLしたEasyBotterをサーバーへアップロードする為に必要です。 @PAGESなどのサーバーにはファイルマネージャーという機能があります。 これを使う場合には、FTPソフトは必要ありません。 Windows用 FFFTP(配布元) FileZilla(配布元) Mac用 FireFTP(配布元) ※Firefoxアドオン FileZilla(配布元)
https://w.atwiki.jp/easybotter_wiki/pages/33.html
このページへ誘導されてきた方へ このページに「回答」はありません、脱初心者を目指す意欲的な方のお勉強の取っ掛かりをサポートするページです。 このページを読解していただくことでbot.php編集における基本・応用がこなせるようになります。 ソースのコピペは思わぬ誤作動の元となりやすく、またコピペで済ませることで誤作動の原因に気付きにくくなる欠点があります。 bot.phpを構成しているPHPのパーツを理解することで、bot.phpの全体を正しく把握し制御できるようになります。 ここでは「プログラミングができなくても~」というEasyBotterの基本にもとづき、あえてプログラミングの説明らしからぬ方法で説明している部分もあります。 プログラミング初心者にプログラミングの基礎を学んでもらうモノなので、プログラミング慣れした方には違和感あるかと思いますがご容赦ください。 またEasyBotterに関連するものに特化して説明していますので、PHP自体に興味をもたれた方は本家のマニュアルなどを参照されると良いでしょう。 EasyBotterは基本性能が備わっているので、基礎を勉強することで比較的容易に改造に着手することができます。 botをの機能を発展させたいと思う方は是非、基礎を勉強してみてください。 時間分けとは? 制御構造「if」ifの基本形 ifの拡張機能 if文の複雑化 if文の要素一覧 関数とは?date関数 演算子とは?代数演算子とは?代数演算子 比較演算子とは?比較演算子 論理演算子とは?論理演算子 代入演算子とは?代入演算子 演算子の優先順位 変数とは?変数の設定 最後に コメント 時間分けとは? botの動作を複雑化させる為に必要な時間分けですが、何から調べればよいのかわからない、という方も多いのではないでしょうか。 ここでは時間分けで使う内容を分解しそれぞれを理解することで、時間分けをマスターします。 時間分けを理解している方は以下の内容を正しく理解できるでしょう。 if(date("G") == 7 date("i") == 30){ $response = $eb- postRandom("0730.txt"); } 正解は「7時かつ30分の場合、0730.txtからランダムポストを行い、7時かつ30分の場合の処理を終える」です。 簡単に書けば「7時30分に0730.txtからランダムポスト」で済みますが、上記のように書いたのには理由があります。 bot.phpにおいては、関数や演算子などを条件文に入れ込むことで構成されていきます。 「関数」「演算子」「条件文」というと難しいイメージを持つかもしれませんが、パターンは多くありません。 まずは時間分けの基本形を知ることで、複雑な動作を分解してみましょう。 制御構造「if」 ここではifを使った条件分岐を説明しますが、初めに「プログラムは書かれた順に実行される」ということを覚えていてください。 これはこの項目に限らず全てのプログラムに通じるものです。 つまり条件をいくつも提示した場合、先に書かれた条件が優先されるのです。 ifの基本形 まずはif文の基本形を見てみましょう。 if(条件){処理;} たったこれだけです。 if文は英語の「もし~ならば」という意味と同じで、この場合は「もし条件に当てはまるなら処理をする」というものです。 if(条件1){処理1;} if(条件2){処理2;} if(条件3){処理3;} このように何行も並列していけばこの基本形だけで時間分けは可能ですが、スマートな書き方とは言い難いものです。 ifの拡張機能 それではif文の拡張機能「else if」「else」を使ってみましょう。 if(条件1){ 処理1; } else if(条件2){ 処理2; } else{ 処理3; } elseは英語の「その他」という意味と同じとなります。 else ifは「他にもし~ならば」、elseは「その他の場合は」、となります。 ここで問題です、【条件1】にも【条件2】にも当てはまる場合、処理はどのようになるのでしょうか? ここで「プログラムは書かれた順に実行される」を思い出しましょう。 書かれた順、つまり最初の【条件1】に対応する【処理1】が行われることはわかりますね? では【条件2】にも当てはまっているので【処理2】も行われるのでしょうか……答えはNO。 「else」という英単語には「その他」という意味があることは先に説明しましたが、これには「既にあるものは除いて」という意味が含まれています。 つまり、【条件1】に当てはまるものは【処理1】が終わった時点で終了、【条件1】に当てはまらなかったものだけが【条件2】の判定へ進むことができるのです。 また【条件1】にも【条件2】にも当てはまらない、つまり「その他の場合」は【処理3】が実行されます。 if文の複雑化 if文は一つの条件で二つ以上の処理をすることもできます。 if(条件1){ 処理1a; 処理1b; } else if(条件2){ 処理2a; 処理2b; } else{ 処理a; 処理b; } また、「if」「else if」「else」の処理にさらなるif文を入れ込むこともできます。 if(条件1){ if(条件a){ 処理1a; } else if(条件b){ 処理1b; } else{ 処理1; } } else if(条件2){ if(条件a){ 処理2a; } else{ 処理2; } } else{ if(条件a){ 処理a-1; 処理a-2; 処理a-3; } } if文は上記のような2段階に限らず、3段階4段階と増やすことができます。 if文の要素一覧 if もし【条件】に当てはまるなら【処理】を実行、「}」以降に条件を持ちこさない 条件分岐させる場合、必ず最初に書くもの。(ただし並列して実行する条件分岐は別) else if 他にもし【条件】に当てはまるなら【処理】を実行、「}」以降に条件を持ちこさない 「if」または「else if」の後につけることができる。なくても良い。 else その他の場合は【処理】を実行、「}」で同列冒頭にあるif文を終了する 「if」「else if」の条件のどれにも当てはまらない場合の処理。なくても良い。 () 【条件】内容を丸括弧で囲む 「if」「else if」で使えるが、「else」では使えない。条件は演算子を使うことで複雑化・詳細化できる。 {} 【処理】内容を波括弧で囲む 「if」「else if」「else」のいずれでも必要。複数行可、複数の処理を書いても良い。 ; 【処理】内容の最後に必要なセミコロン これを忘れるとエラーになる、消し過ぎに注意。 関数とは? 「関数」とは一定の処理を行いその結果や値を反映させるものです。 EasyBotterでは特にbot.phpで時間わけをする時に使う「date関数」がなじみ深く、また重要な関数となります。 ここではEasyBotterで使うdate関数について説明します。 date関数 bot.phpでの使用頻度が高い物、bot.phpの動作が工夫できるものを紹介しています。 詳細はPHPマニュアルをご覧ください。 単位 date("?") 値 特徴 利用法 年 Y 2011など 4桁の西暦 y 11など 下2桁の西暦 L 0~1 0=平年、1=うるう年 2月やdate("z")を使う時に有用 月 n 1~12 1桁の月には0をつけない bot.phpで使う機会が多い、覚えてしまおう m 01~12 1桁の月に0をつける t 28~31 その月が何日まであるか date("t")とdate("j")の値が同じ時は月末日、など 日 j 1~31 1桁の日には0をつけない bot.phpで使う機会が多い、覚えてしまおう d 01~31 1桁の日に0をつける z 0~365 その年の何日目か(1月1日が0) 34(立春)以降は春、124/125(5月5日/立夏)以降は夏~など工夫できる 時 G 0~23 24時制、1桁には0をつけない bot.phpで頻出、覚えてしまおう H 00~24 24時制、1桁に0をつける g 0~12 12時制、1桁には0をつけない h 00~12 12時制、1桁に0をつける A AM、PM 午前午後、大文字 12時制の時に有用 a am、pm 午前午後、小文字 分 i 00~59 1桁には0をつける bot.phpで頻出、覚えてしまおう 秒 s 00~59 1桁には0をつける CRONとの誤差が生じやすい為あまり使う事は無い 曜日 w 0~6 0=日曜、1=月曜…6=土曜 数値なので1~5は平日、その他は週末、という分け方も D Mon~Sun 英語の略表記 "w"の意味がわからない方に…スペルミスに注意 演算子とは? 代数演算子とは? 加減乗除など、主に数値の計算をするものです。(文字列などによる例外もあります) bot.phpでは「%」を使う機会が多いのですが、その意味を間違えている方も少なくありません。 いずれも小学校で習う算数レベルなので、意味を理解すれば難しいものではありません。 代数演算子 bot.phpでの使用頻度が高い物を紹介しています。 詳細はPHPマニュアルをご覧ください。 + A + B 加算 AにBを足した値 「3 + 7」の値は「10」 - A - B 減算 AからBを引いた値 「19 - 9」の値は「10」 * A * B 乗算 AにBを掛けた値 「2 * 5」の値は「10」 / A / B 除算 AをBで割った値 「10 / 4」の値は「2.5」 % A % B 剰余 AをBで割った時の余り 「10 % 7」の値は「3」 比較演算子とは? 名前の通り、演算子の左右にあるものを比較します。 bot.phpの編集において欠かせないものですので、是非覚えましょう。 また、使い方次第で複雑な設定をすることができます。 比較演算子 bot.phpでの使用頻度が高い物を紹介しています。 詳細はPHPマニュアルをご覧ください。 A == B AとBが等しい A === B AとBが同型かつ等しい A != B AとBが等しくない A B A !== B AとBが同型でないか等しくない A B AがBより少ない A B AがBより多い A = B AがB以下 A = B AがB以上 これも小学生で習うことですが、「より少ない」「より多い」はその数値を含まない、「以下」「以上」はその数値を含む、という算数の基本を間違えないよう注意。 論理演算子とは? 論理演算をおこなう為の演算子です……「論理演算」と聞くと耳慣れませんが、「ベン図」と聞くとピンと来る方もいるかと思います。 (ベン図についてはWikipediaの論理演算とペン図に詳しいのでこの場では説明を省略します。) 条件の組み合わせを一つの式の中に収める為に使われるもので、AND・OR・NOTという基本で成り立ちます。 論理演算子 bot.phpでの使用頻度が高い物を紹介しています。 詳細はPHPマニュアルをご覧ください。 A B AかつBの場合【優先度:高】 A || B AまたはBの場合【優先度:高】「||」はwiki仕様の都合上全角になっています、半角に直して下さい A and B AかつBの場合【優先度:低】 A or B AまたはBの場合【優先度:低】 A xor B AとBのうちどちらかにだけ当てはまる場合 !A Aに当てはまらない場合 「A B C」「A || B || C」「A B or C D」のように、複数の論理演算子を使うこともできます。 ちなみに「A B or C D」は優先順位の関係で「AかつB、または、CかつDの場合」となります。 代入演算子とは? 文字通り「代入」する為の演算子で、代入するものは数値に限らず文字列も代入することが可能です。 代入演算子の左辺にくるものは「$a」のような変数であることが殆どです。 この代入演算子はbot.php編集において必須の要素ではありません、脱初心者してから考える事で説明していますが、EasyBotterにおいては完全に脱初心者してからとりかかる分野となります。 代入演算子 bot.phpでの使用頻度が高い物を紹介しています。 A = B AにBを代入する 結果的にA=B A += B AにBを加算したものを、Aに代入する 結果的にA+B A .= B AにBを続けて、Aに代入する 結果的にAB A ++ Aに1を加算したものを、Aに代入する 結果的にA+1 A -- Aから1減算したものを、Aに代入する 結果的にA-1 演算子の優先順位 全ての演算子には優先順位が設定されており、複雑な動作を構築する上で留意しておかなければなりません。 特に論理演算子は当該項目でも説明していますが、動作に大きく影響するものなので優先順位を把握し適切に使用しましょう。 詳細はPHPマニュアルをご覧ください。 変数とは? 変数はプログラムにおける一時的なデータの事で、特定の文字列や数値に名前をつけることができます。 この変数はbot.php編集において必須の要素ではありません、脱初心者してから考える事で説明していますが、EasyBotterにおいては完全に脱初心者してからとりかかる分野となります。 変数の設定 変数名は「半角英数(a~z、A~Z、0~9)」及び「アンダーバー(_)」ならば下記の事項以外で特に制限はありません。 変数名は必ず「$」から始めなければなりません 「$」の直後に半角数字を置く事はできません 「$」の直後は半角アルファベットまたはアンダーバーでなければなりません 大文字と小文字は別の文字として扱われます 「$12345」という変数名は数字から始まっているのでダメですが、「$abc123」や「$_1234」はOKです。 また「$ABCD」「$Abcd」「$abcd」は大文字・小文字の差異がある為、全て別の変数として扱われます。 基本的に変数名に使用する文字数に制限はありません、「$a」のような1文字でも良いですし「$today_year_month_day_week」のような長いものでも大丈夫です。 自分で命名できるものですから、自分がわかるものならば大丈夫です。 ただし、文字数が多くなり過ぎるとスペルミスも起こりやすくなるので「$today_year_month_day_week」は「$today_YMDW」と短縮するなど、個人で考えて使用してください。 最後に ここまで読んでいただければ、このページ冒頭の時間分けとは?で書いた if(date("G") == 7 date("i") == 30){ $response = $eb- postRandom("0730.txt"); } を「7時30分に0730.txtからランダムポスト」ではなく、「7時かつ30分の場合、0730.txtからランダムポストを行い、7時かつ30分の場合の処理を終える」が正解である、と説明したことを理解していただけたと思います。 それでは例題です、難しい構造ではないのでわかりますね? if(date("G") == 7 date("i") == 30){ $response = $eb- postRandom("0730.txt"); } else if(date("G") == 12 date("i") == 0){ if(date("w") == 0 || date("w") == 6){ $response = $eb- postRandom("1200_weekend.txt"); } else{ $response = $eb- postRandom("1200_weekday.txt"); } } else if(date("G") == 23 date("i") == 30){ $response = $eb- postRandom("2330.txt"); } else{ $response = $eb- postRandom("sonota.txt"); } if(date("n") == 1 date("j") == 1 date("G") == 0 date("i") == 0){ $response = $eb- postRandom("newyear.txt"); } 正解は、「毎日7 30に0730.txtからランダムポスト、土日の12 00に1200_weekend.txtからランダムポスト、月~金曜日の12 00に1200_weekday.txtからランダムポスト、毎日23 30に2330.txtからランダムポスト、それ以外の実行はsonota.txtからランダムポスト。1月1日0時00分にnewyear.txtからランダムポスト。」です。 日時での条件分岐はつい「月→日→時→分」という順番で条件付けしがちですが、毎日同じ時間に実行するものを日にちや曜日で変えたい場合は、先に時間を指定してから日にちや曜日で分岐させる方がスマートな構造になります。 また、先に「時」「分」のようにちょっとしたズレで数値が変わってしまうものを条件判定することで、時間ズレ対策にもなります。 是非、工夫を凝らしてあなたなりのbot.phpを書いてみて下さい。 コメント とりあえず一通りの説明を書き終えました、内容の修正等ありましたらご自由にどうぞ。その他何かあればEasyBotterBBS内の非公式wkiスレに書いていただければと思います。 -- あずき (2011-07-04 00 32 19) あずき様、更新お疲れ様でした! -- 名無しさん (2011-07-04 23 13 04) わかりやすくて目から鱗です 有難うございます -- aisk (2011-11-10 15 52 12) 名前 コメント
https://w.atwiki.jp/easybotter_wiki/pages/2.html
トップページ Read me 質問する前に 注意事項 ver.2.1版 機能追加ID別設定 乗っ取り対策 地震で自動停止させる ver.2.0beta版 設置手順前準備~設置編 最新のAPIに変更 手動実行編 エラー解決編 脱初心者編 機能追加時間分け 時間分けマスターになる為に reply replyTimeline postRandom postRotation ID別設定 よくある質問設定 OAuth関連 エラーは出ないのに… PHPエラー おまけ簡易ローカルチェック 不具合一覧 ver.1.42版 よくある質問OAuth関連 機能追加 脱初心者出来たら! その他Twitter Bot関連リンク Twitter Bot BBS(外部サイト) 更新履歴 取得中です。 ここを編集
https://w.atwiki.jp/easybotter_wiki/pages/30.html
時間作動をローカルチェックしたい人向け(簡易) ソースはTwitter Bot BBSから 1.下記のような構成のPHPファイルを作る。 2.そのファイルをPHPが使えるサーバーにアップさせる。 3.そのPHPファイルにアクセスする (エラーがある場合は、エラーログが出る) ●メインファイル html lang=ja head title PHP動作チェック用 /title body h3 動作チェック /h3 ?php require("読み出しファイル名"); ? hr /body /html 上記を適当な名前を付けて拡張子.php(PHPファイル)で保存する。 ●読み出しファイル(例) ?php if(date("G") 23 || date("G") 6){ echo "24時~5時に表示されるよ"; } elseif(date("G") 17 || date("G") 0){ echo "18時~23時に表示されるよ"; } elseif(date("G") 11 date("G") 18){ echo "12時~17時に表示されるよ"; } else{ echo "6時~11時に表示されるよ"; } ? こちらも同様に適当な名前を付けて拡張子.php(PHPファイル)で保存する。 直接メインファイルに書いても効果があるが、別ファイルにしておく事で 書き換えたい場合、こちらのファイルを書き直すだけで済む。 読み出しファイルなので必要に同じ書き換えてください。 リプライパターンファイルの簡易チェック 上記のメインファイルをreply_pattern.phpと同じディレクトリに入れるかディレクトリを参照させる。 上記のメインファイルの ?php require("読み出しファイル名"); ? とあるところを ?php require("reply_pattern.php"); print_r($data); ? と書き換える。 または 同時に調べたい場合は hr の下に付け加える h3 リプライパターン定義チェック /h3 ?php require("reply_pattern.php"); print_r($data); ? hr 結果の表示は、しっかりと定義されたかどうか。 { } , " の過不足など、エラーチェックができる。 ただし、正規表現は対象外。
https://w.atwiki.jp/easybotter_wiki/pages/17.html
PHPへ手を付ける前に PHPへ着手するにあたって自宅サーバー上でテストしてみる 段差を付けよう! PHPへ手を付ける前に 正規表現(メタ文字) 演算子 比較演算子 条件分岐(if、switch) date関数 以上の知識があるとここで紹介している機能の他、色々な改造が出来るようになります。 興味がある方はPHPを勉強してみるのもいいかもしれません。 Twitter Bot関連リンクでPHP解説サイトを紹介していますので、そちらを参考に。 data関数はPHPマニュアルに簡易リストがあります。 PHPへ着手するにあたって まずはbot.phpに書かれている説明と公式サイトの"基本の設定"解説を熟読しましょう。 設置手順 前準備~設置編でも紹介したように、PHP対応のテキストエディタを使用しよう。~~構文チェック機能付きが望ましいです。 自宅サーバー上でテストしてみる EasyBotter.phpやbot.phpを編集する前に、自宅サーバー上で構文テストしてみることをお勧めしたい。 easyPHP等が手軽でお勧め(skypeなど、ポート80を使用している他プログラムは終了させる。) ↓ 例:午前と午後の発言を変えたい! if(date("a") == "am"){ $response = $eb- postRandom("am.txt"); }else{ $response = $eb- postRandom("pm.txt"); } とbot.phpへ記述したい。 bot.phpを編集する前に、自宅サーバー上に適当なphpファイル(例:test.php)を作って ?php if(date("a") == "am"){ echo "午前ですよ~"; }else{ echo "午後ですよ~"; } ? と記述し、保存。自宅サーバーで動かしてみる(アクセスしてみる。) 正常に機能し(コメントが表示され)ていればbot.phpへ導入させてみる! ※bot.phpを自宅サーバー上で動かすには、それなりに環境設定する必要があります。 段差を付けよう! if{}else{}沢山使っていると、何処で{}を閉じたか・閉じてないかがややこしくなってきます。 そんな時はTABキーや空白文字で段差を付けて整理しよう。 if(date("i") % 15 === 0){ if(date("H") 21){ $randOPfile = "txtlog.dat"; if(date("i") 5){ $post_randOP = rand(0,21); $fp = fopen($randOPfile, "w"); @fwrite( $fp, $post_randOP, strlen($post_randOP) ); fclose($fp); } $contents = @file_get_contents($randOPfile); }else{ $contents = date("H"); } $contents = "post_".$contents.".txt"; $response = $eb- postRotation($contents,"──"); } 何がなんだか… TABキーで整理してみよう if(date("i") % 15 === 0){ if(date("H") 21){ $randOPfile = "txtlog.dat"; if(date("i") 5){ $post_randOP = rand(0,21); $fp = fopen($randOPfile, "w"); @fwrite( $fp, $post_randOP, strlen($post_randOP) ); fclose($fp); } $contents = @file_get_contents($randOPfile); }else{ $contents = date("H"); } $contents = "post_".$contents.".txt"; $response = $eb- postRotation($contents,"──"); } 見やすくなったよね?これで記述ミスも少なくなる…はず。
https://w.atwiki.jp/easybotter_wiki/pages/15.html
質問スレで質問する前に読むこと! 56と 161引用 初心者スレ利用者は以下のテンプレを使用してください。 【バージョン】 【設置鯖名】 レン鯖名/自宅鯖 【PHPのバージョン】 【実行】 CRON鯖名/ブラウザ自動更新/手動/他 【手動】 動く/動かない 【不明点など】 (エラーメッセージがあればコピペ推奨) また、思いつく単語をこのスレと関連スレで検索してください。 リプライ:リプ、@、replyなどで検索 タイムライン:TL、タイムラインなどで検索 CRON:CRON、bot.phpなどで検索 二重投稿:二重投稿、if、bot.phpなどで検索 リプライと同時に他のポストをする:bot.php、ifなどで検索 via~変更:http //twitter.com/oauth_clients スクリプト初体験の方は、PHPリファレンスで最低限の勉強 正規表現(メタ文字) 演算子 比較演算子 条件分岐(if、switch) date関数 ここまで
https://w.atwiki.jp/twitterbot/pages/706.html
debug_reply / 海東純一 Web 自己紹介 「申し遅れました。私はエリア管理委員会次官・海東純一と申します☆彡言わば、BOTです☆彡」 テスト用BOTです、色々実験してます。リプライしたりしなかったり。(作成者 @ovvv) タグ 仮面ライダー 特撮 最近のつぶやき 新着記事は見つかりませんでした。 最終更新 2009/09/07 14 10 51
https://w.atwiki.jp/kojiro/pages/518.html
MAIL.REPLY
https://w.atwiki.jp/touhoukashi/pages/4332.html
【登録タグ N イオシス イザベル メイガスナイト 曲 東方紫雨天獄】 【注意】 現在、このページはJavaScriptの利用が一時制限されています。この表示状態ではトラック情報が正しく表示されません。 この問題は、以下のいずれかが原因となっています。 ページがAMP表示となっている ウィキ内検索からページを表示している これを解決するには、こちらをクリックし、ページを通常表示にしてください。 /** General styling **/ @font-face { font-family Noto Sans JP ; font-display swap; font-style normal; font-weight 350; src url(https //img.atwikiimg.com/www31.atwiki.jp/touhoukashi/attach/2972/10/NotoSansCJKjp-DemiLight.woff2) format( woff2 ), url(https //img.atwikiimg.com/www31.atwiki.jp/touhoukashi/attach/2972/9/NotoSansCJKjp-DemiLight.woff) format( woff ), url(https //img.atwikiimg.com/www31.atwiki.jp/touhoukashi/attach/2972/8/NotoSansCJKjp-DemiLight.ttf) format( truetype ); } @font-face { font-family Noto Sans JP ; font-display swap; font-style normal; font-weight bold; src url(https //img.atwikiimg.com/www31.atwiki.jp/touhoukashi/attach/2972/13/NotoSansCJKjp-Medium.woff2) format( woff2 ), url(https //img.atwikiimg.com/www31.atwiki.jp/touhoukashi/attach/2972/12/NotoSansCJKjp-Medium.woff) format( woff ), url(https //img.atwikiimg.com/www31.atwiki.jp/touhoukashi/attach/2972/11/NotoSansCJKjp-Medium.ttf) format( truetype ); } rt { font-family Arial, Verdana, Helvetica, sans-serif; } /** Main table styling **/ #trackinfo, #lyrics { font-family Noto Sans JP , sans-serif; font-weight 350; } .track_number { font-family Rockwell; font-weight bold; } .track_number after { content . ; } #track_args, .amp_text { display none; } #trackinfo { position relative; float right; margin 0 0 1em 1em; padding 0.3em; width 320px; border-collapse separate; border-radius 5px; border-spacing 0; background-color #F9F9F9; font-size 90%; line-height 1.4em; } #trackinfo th { white-space nowrap; } #trackinfo th, #trackinfo td { border none !important; } #trackinfo thead th { background-color #D8D8D8; box-shadow 0 -3px #F9F9F9 inset; padding 4px 2.5em 7px; white-space normal; font-size 120%; text-align center; } .trackrow { background-color #F0F0F0; box-shadow 0 2px #F9F9F9 inset, 0 -2px #F9F9F9 inset; } #trackinfo td ul { margin 0; padding 0; list-style none; } #trackinfo li { line-height 16px; } #trackinfo li nth-of-type(n+2) { margin-top 6px; } #trackinfo dl { margin 0; } #trackinfo dt { font-size small; font-weight bold; } #trackinfo dd { margin-left 1.2em; } #trackinfo dd + dt { margin-top .5em; } #trackinfo_help { position absolute; top 3px; right 8px; font-size 80%; } /** Media styling **/ #trackinfo .media th { background-color #D8D8D8; padding 4px 0; font-size 95%; text-align center; } .media td { padding 0 2px; } .media iframe nth-of-type(n+2) { margin-top 0.3em; } .youtube + .nicovideo, .youtube + .soundcloud, .nicovideo + .soundcloud { margin-top 0.75em; } .media_section { display flex; align-items center; text-align center; } .media_section before, .media_section after { display block; flex-grow 1; content ; height 1px; } .media_section before { margin-right 0.5em; background linear-gradient(-90deg, #888, transparent); } .media_section after { margin-left 0.5em; background linear-gradient(90deg, #888, transparent); } .media_notice { color firebrick; font-size 77.5%; } /** Around track styling **/ .next-track { float right; } /** Infomation styling **/ #trackinfo .info_header th { padding .3em .5em; background-color #D8D8D8; font-size 95%; } #trackinfo .infomation_show_btn_wrapper { float right; font-size 12px; user-select none; } #trackinfo .infomation_show_btn { cursor pointer; } #trackinfo .info_content td { padding 0 0 0 5px; height 0; transition .3s; } #trackinfo .info_content ul { padding 0; margin 0; max-height 0; list-style initial; transition .3s; } #trackinfo .info_content li { opacity 0; visibility hidden; margin 0 0 0 1.5em; transition .3s, opacity .2s; } #trackinfo .info_content.infomation_show td { padding 5px; height 100%; } #trackinfo .info_content.infomation_show ul { padding 5px 0; max-height 50em; } #trackinfo .info_content.infomation_show li { opacity 1; visibility visible; } #trackinfo .info_content.infomation_show li nth-of-type(n+2) { margin-top 10px; } /** Lyrics styling **/ #lyrics { font-size 1.06em; line-height 1.6em; } .not_in_card, .inaudible { display inline; position relative; } .not_in_card { border-bottom dashed 1px #D0D0D0; } .tooltip { display flex; visibility hidden; position absolute; top -42.5px; left 0; width 275px; min-height 20px; max-height 100px; padding 10px; border-radius 5px; background-color #555; align-items center; color #FFF; font-size 85%; line-height 20px; text-align center; white-space nowrap; opacity 0; transition 0.7s; -webkit-user-select none; -moz-user-select none; -ms-user-select none; user-select none; } .inaudible .tooltip { top -68.5px; } span hover + .tooltip { visibility visible; top -47.5px; opacity 0.8; transition 0.3s; } .inaudible span hover + .tooltip { top -73.5px; } .not_in_card span.hide { top -42.5px; opacity 0; transition 0.7s; } .inaudible .img { display inline-block; width 3.45em; height 1.25em; margin-right 4px; margin-bottom -3.5px; margin-left 4px; background-image url(https //img.atwikiimg.com/www31.atwiki.jp/touhoukashi/attach/2971/7/Inaudible.png); background-size contain; background-repeat no-repeat; } .not_in_card after, .inaudible .img after { content ; visibility hidden; position absolute; top -8.5px; left 42.5%; border-width 5px; border-style solid; border-color #555 transparent transparent transparent; opacity 0; transition 0.7s; } .not_in_card hover after, .inaudible .img hover after { content ; visibility visible; top -13.5px; left 42.5%; opacity 0.8; transition 0.3s; } .not_in_card after { top -2.5px; left 50%; } .not_in_card hover after { top -7.5px; left 50%; } .not_in_card.hide after { visibility hidden; top -2.5px; opacity 0; transition 0.7s; } /** For mobile device styling **/ .uk-overflow-container { display inline; } #trackinfo.mobile { display table; float none; width 100%; margin auto; margin-bottom 1em; } #trackinfo.mobile th { text-transform none; } #trackinfo.mobile tbody tr not(.media) th { text-align left; background-color unset; } #trackinfo.mobile td { white-space normal; } document.addEventListener( DOMContentLoaded , function() { use strict ; const headers = { title アルバム別曲名 , album アルバム , circle サークル , vocal Vocal , lyric Lyric , chorus Chorus , narrator Narration , rap Rap , voice Voice , whistle Whistle (口笛) , translate Translation (翻訳) , arrange Arrange , artist Artist , bass Bass , cajon Cajon (カホン) , drum Drum , guitar Guitar , keyboard Keyboard , mc MC , mix Mix , piano Piano , sax Sax , strings Strings , synthesizer Synthesizer , trumpet Trumpet , violin Violin , original 原曲 , image_song イメージ曲 }; const rPagename = /(?=^|.*